Snowflake AI & ML ML Fucntionsの異常検出機能を試してみた
データ事業本部 インテグレーション部 機械学習チームの鈴木です。
SnowflakeのML Functionsの1機能として、Anomaly Detectionが一般提供されています。
今回試してみましたが、機能が豊富でだったため、ガイドからポイントとなりそうな点やほかに参考になった資料をご紹介します。
ML Functionsとは
Snowflake AI & MLの1機能で、機械学習による分析や推論を担うものとなっています。
Snowflakeにおける機械学習の機能としては、ほかにSnowpark MLがありますが、あちらはPythonスクリプトを記述して従来通りモデルを開発していくイメージであるのに対して、ML FunctionsはSQLを使って誰でも簡単に機械学習のモデル開発・利用ができる代わりに、ある程度用途や使い方が決まっているものになります。
現状は以下の機能があります。
- 異常検出
- 時系列予測
- 分類(パブリックプレビュー)
- 要因分析(パブリックプレビュー)
今回は異常検出について取り上げます。
Anomaly Detectionの機能
枠組みについて
Anomaly Detectionにより、時系列データ内の外れ値(予想範囲から外れたデータ)を検出するようにモデルをトレーニングできます。
Anomaly Detectionでは、以下のパターンをサポートしています。
- 教師あり・なし
- 複数系列の異常検出
- 外生変数(ターゲット値に影響を与えた可能性のある追加の変数)
モデルは現状は勾配ブースティングマシン (GBM)であること、随時改良がリリースされることがガイドで紹介されています。カテゴリ変数をトレーニングするときにワンホットエンコーディングに依存せず、高カーディナリティなカテゴリデータに対しても使用できます。
使用するウェアハウスはトレーニングデータが単一系列か複数系列か・データセットの行数・外生変数の有無によって変わります。大規模なトレーニングジョブでは、Snowparkに最適化されたウェアハウスを使用する必要があります。
関数の使い方について
CREATE SNOWFLAKE.ML.ANOMALY_DETECTION
でモデルを訓練し、<モデル名>!DETECT_ANOMALIES
で異常検出を実行できます。
教師あり・なしなどは引数に指定する値や指定の有無で変わります。
やってみる
以下、簡単に試してみたテストコードのポイントをご紹介します。コードは基本的にガイドに記載のものを引用します。SQL文はNotebookより実行しました。
0. データの作成
ガイドにしたがってテストデータが格納されたhistorical_sales_data
テーブルおよびnew_sales_data
テーブルを作成しました。
異常検出モデルにデータを入力するために、各種ビューを作成しました。ビューを作成しなくても、INPUT_DATA
引数にSELECT文を指定もできます。
1. 教師なし学習
以下のようにモデルの訓練と異常検出ができました。
-- 以下のガイドより2024/8/4に引用
-- https://docs.snowflake.com/en/user-guide/ml-functions/anomaly-detection
CREATE OR REPLACE SNOWFLAKE.ML.ANOMALY_DETECTION basic_model(
INPUT_DATA => TABLE(view_with_training_data),
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales',
LABEL_COLNAME => '');
CALL basic_model!DETECT_ANOMALIES(
INPUT_DATA => TABLE(view_with_data_to_analyze),
TIMESTAMP_COLNAME =>'date',
TARGET_COLNAME => 'sales'
);
検出結果は以下のようになりました。IS_ANOMALY
より以上の有無が確認できます。
推論時にはCONFIG_OBJECT
に感度レベルを指定できます。デフォルトは0.99
でデータの約1%が異常としてマークされます。
2. 教師あり学習
CREATE SNOWFLAKE.ML.ANOMALY_DETECTION
でLABEL_COLNAME
にラベル列を指定することで、教師あり学習を行うことができました。
-- 以下のガイドより2024/8/4に引用
-- https://docs.snowflake.com/en/user-guide/ml-functions/anomaly-detection
CREATE OR REPLACE SNOWFLAKE.ML.ANOMALY_DETECTION model_trained_with_labeled_data(
INPUT_DATA => TABLE(view_with_labeled_data_for_training),
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales',
LABEL_COLNAME => 'label'
);
CALL model_trained_with_labeled_data!DETECT_ANOMALIES(
INPUT_DATA => TABLE(view_with_data_to_analyze),
TIMESTAMP_COLNAME =>'date',
TARGET_COLNAME => 'sales'
);
なお、複数系列に対して訓練・推論を行う場合は、SERIES_COLNAME
引数にカラム名を指定します。
-- 以下のガイドより2024/8/4に引用
-- https://docs.snowflake.com/en/user-guide/ml-functions/anomaly-detection
CREATE OR REPLACE SNOWFLAKE.ML.ANOMALY_DETECTION model_for_multiple_series(
INPUT_DATA => TABLE(view_with_training_data_multiple_series),
SERIES_COLNAME => 'store_item',
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales',
LABEL_COLNAME => 'label'
);
外生変数は入力のうち、TIMESTAMP_COLNAME
やTARGET_COLNAME
で指定されていないカラムが利用されます。
-- 以下のガイドより2024/8/4に引用
-- https://docs.snowflake.com/en/user-guide/ml-functions/anomaly-detection
CREATE OR REPLACE VIEW view_with_data_for_analysis_extra_columns
AS SELECT date, sales, temperature, humidity, holiday
FROM new_sales_data
WHERE store_id=1 AND item='jacket';
CALL model_with_additional_columns!DETECT_ANOMALIES(
INPUT_DATA => TABLE(view_with_data_for_analysis_extra_columns),
TIMESTAMP_COLNAME => 'date',
TARGET_COLNAME => 'sales'
);
このように、訓練時の引数の指定によって、学習の教師あり・なしや系列数、外生変数の有無を、とても簡単に使い分けることができます。
最後に
簡単にですが、ML Functionsの異常検出機能について使い方を確認しました。
異常検出の結果については、検出結果のIS_ANOMALY
カラムをプログラム的に確認し、通知などを行う仕組みを作成するか、結果をテーブルに保存し、Streamlitなどでアプリを作成して確認するようにするとよさそうです。
定期実行の仕組みとしては、ガイドではタスクで1分ごとに異常検出を実行し、異常があればSnowflake Alertsによりメール通知する方法も紹介されていました。
モデルのアルゴリズム自体は、随時アップデートが適用されるため、完全に固定のものでなくても良いので、手軽にSQLだけで異常検出を実装したいという場合にはぴったりな機能だと思います。
ガイド以外にも、クイックスタートもあるため、興味がある方はぜひ試してみて頂ければと思います。